package com.jnshu.tools;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.jnshu.tools.binding.JsonUtil;
import org.springframework.util.StringUtils;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Martin
 * @date 2019/8/6 10:06
 * token工具类
 */
public class JwtUtil {
    //声明一个token密匙，并保存在服务端
    private static final String SECRET = "CuteTeam";
    //设置token过期时间单位：天
    private static final int expire = Calendar.DATE;
    //设置token过期时间
    private static final int expireTime = 5;

    /**生成token*/
    public static String createToken(Long id){
        //定义token签发时间
        Date signDate = new Date();
        //定义token过期时间
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(expire,expireTime);
        Date expireAt = nowTime.getTime();
        //定义token的头部
        Map<String,Object> map = new HashMap<>();
        //加密算法
        map.put("alg","HS256");
        //类别
        map.put("typ","JWT");
        //生成token
        String token = JWT.create()
                        //生成token头部信息
                        .withHeader(map)
                        //生成token载体信息
                        .withClaim("id",id.toString())
                        //获取token的签发时间
                        .withIssuedAt(signDate)
                        //获取token的过期时间
                        .withExpiresAt(expireAt)
                        .sign(Algorithm.HMAC256(SECRET));
        return token;
    }

    /**解析token*/
    public static DecodedJWT verifyToken(String token){
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        //解析成功，返回token的载体信息
        return verifier.verify(token);
    }

//    /**获取用户id*/
//    public static Long getUserId(String token){
//        Map<String,Claim> claims = verifyToken(token);
//        Claim id = claims.get("id");
//        if (id == null || StringUtils.isEmpty(id.asString())){
//            return 0L;
//        }
//        return Long.valueOf(id.asString());
//    }
}
